package com.example.demo.config;

import com.google.common.util.concurrent.RateLimiter;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 限流拦截器实现类
 * 实现Spring的HandlerInterceptor接口，用于在请求处理前进行限流控制
 */
public class RateLimiterInterceptor implements HandlerInterceptor {

    // Guava的限流器实例
    private final RateLimiter rateLimiter;

    /**
     * 构造函数，注入RateLimiter实例
     * @param rateLimiter 限流器，由RateLimiterConfig配置类创建并注入
     */
    public RateLimiterInterceptor(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    /**
     * 在控制器方法执行前进行拦截
     * @param request HttpServletRequest对象
     * @param response HttpServletResponse对象
     * @param handler 处理程序对象
     * @return boolean 是否放行请求
     *         true - 放行请求，继续后续处理
     *         false - 拦截请求，不再继续处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 尝试从限流器获取令牌
        if (!rateLimiter.tryAcquire()) {
            // 获取令牌失败，返回429状态码(Too Many Requests)
            response.setStatus(429);
            // 拦截请求
            return false;
        }
        // 获取令牌成功，放行请求
        return true;
    }
}
